
package monopoli.communication;

import java.util.ArrayList;
import monopoli.Monopoli;

/**
 *
 * @author padul
 */
public class RecoverFail extends Thread {

    private Host host;



    public RecoverFail(Host host) {
        this.host = host;
    }


    @Override
    public void run() {

        String hostFailBindName = "";
        int idGiocatoreFail = 0;
        ArrayList<Object> payload = null;


        //if (host.getNextPlayers().size() > 0)

        //Aggiorna la DebugConsole
        Monopoli.getMonopoliGUI().debugMessage("[DBG_com] " + this.getName());
        

        //Aggiorna la token ring rimuovendo il giocatore caduto e ricava i dati di esso
        hostFailBindName = host.getNextPlayers().get(0).getRMIA().getBindName();
        idGiocatoreFail = host.getNextPlayers().get(0).getIdGiocatore();
        boolean res = host.removeNextPlayer(idGiocatoreFail);

        //Caso in cui il thread corrente deve gestire la rimozione del giocatore
        if (res) {

            //Aggiorna la tab sui Dati Host
            RMIAddress myRMIA, nextRMIA;
            String localHostBindName;
            String localHostIp;
            String localHostPort;
            String nextHostBindName;
            String nextHostIp;
            String nextHostPort;
            
            myRMIA = host.getMyPlayer().getRMIA();
            localHostBindName = myRMIA.getBindName();
            localHostIp = myRMIA.getIp();
            localHostPort = Integer.toString(myRMIA.getPort());

            if (host.getNextPlayers().size() > 0) {
                nextRMIA = host.getNextPlayers().get(0).getRMIA();
                nextHostBindName = nextRMIA.getBindName();
                nextHostIp = nextRMIA.getIp();
                nextHostPort = Integer.toString(nextRMIA.getPort());
            }
            else {
                nextHostBindName = "none";
                nextHostIp = "none";
                nextHostPort = "-1";
            }

            
            
            Monopoli.getMonopoliGUI().getGestoreRefresh().refreshHostData(localHostBindName, localHostIp, localHostPort, nextHostBindName, nextHostIp, nextHostPort);

            //Comunica al livello game la caduta del giocatore
            Monopoli.getMonopoliPartita().getGameToCommunication().comunicaCadutaGiocatore(idGiocatoreFail);

            try {
                //Invio notifica di caduta giocatore
                payload = new ArrayList<Object>();
                payload.add(hostFailBindName);
                payload.add(new Integer(idGiocatoreFail));
                host.sendMsg(Message.TYPE_NOTIFY, Message.SUBTYPE_NOTIFY_DEATH_PLAYER, 0, payload, 1);

                //Reinvio di tutti messaggi che sono in cache
                host.sendAllCachedMsg();
            }
            catch(IndexOutOfBoundsException iobe) {
            }
            
        }

    }
}
